<script setup lang="ts">
// 类型注解： 就是给变量后面 加冒号和类型  :number
// 本质上就是 类型约束： 约束类型， 指定了以后，后面就不能在更改变量的类型
// 有了类型约束， 代码在写的时候，有更好的类型提示。（如果是数组，在变量点的时候，后面就会吧所有数字原型对象上买的方法都给你列举出来）
const a: number = 10; // 本质上是 new Number(10)

// 如果直接写 a.__proto__ 这个代码，在js里面是没问题的，但是在ts里面，a是一个number，数字是没有__proto__这个属性的， 需要我们 用一些技巧，不然ts报错，因为我们知道 a上面就有__ptoto__属性，我们比ts更清楚，就直接用as any来
// 告诉ts我知道他的类型是any，你不用给我判断，这样就没有红色下划线了
console.log((a as any).__proto__ === Number.prototype); // 这句话是js原型，原型链的核心

// a.

// __proto__ 隐式原型  prototype  显式原型(原型对象)
const arr = [1, 2, 3]; // 字面量创建数组 -- 底层就是 new Array([1,2,,3]) --- 万物皆对象
const obj = { name: 11, push: () => {} };

arr.push; // 去它的原型对象上面去找
// 所有对象都有 隐式原型__proto__  所有的函数都有 显式原型 prototype
// 所有的对象的隐式原型 ===  创建这个对象的构造函数的 显式原型
// arr.__proto__   ===  Array.prototype
// arr.push 先在arr 对象自己身上找push方法 ---> 找不到再去 arr.__proto__（前面这个属性不是所有浏览器的标准属性） (Array.prototype去它上面找)
// 如果在Array.prototype 上面还找不到，  arr.__proto__.__proto__ = Array.prototype.__proto__
// (Array.prototype).__proto__ === Object.prototype
arr.isPrototypeOf(1);
// 在往上，就是 Object.prototype.__proto__ === null

// 整个线路 arr.__proto__.__proto__.__proto__ === null
// arr  Array.prototype Object.prototype  null
arr.aaa(); // 报错的线路
</script>

<template>123</template>
